#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QString>
#include <QFile>
#include <QTreeWidget>
#include <QIcon>
#include <QFileInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    QIcon folderIcon;         // 文件夹图标
    QIcon cFileIcon;          // .c 文件图标
    QIcon cppFileIcon;        // .cpp 文件图标
    QIcon hFileIcon;          // .h 文件图标
    QIcon txtFileIcon;        // .txt 文件图标

private slots:
    void on_pushButton_SelectDocument_clicked(); // 选择单个文本文件

private slots:
    void on_pushButton_SelectFolder_clicked();   // 选择文件夹

private slots:
    void on_pushButton_Execute_clicked();        // 执行

private slots:
    /**
     * @brief 处理复选框状态的变化，并递归更新子节点的状态
     * @param item 修改的结点
     * @param column 列
     */
    void onTreeWidgetItemChanged(QTreeWidgetItem *item, int column);

private slots:
    void on_pushButton_AddKeywords_clicked();//添加过滤关键字

private slots:
    void on_pushButton_DeleteKeywords_clicked();//删除过滤关键字

private:
    Ui::MainWindow *ui;

private:
    QString currentPath;//当前处理的路径
private:
    QStringList filterKeywords; // 当前的过滤关键字列表


private:
    /**
     * @brief 将一个文件编码转换为UTF-8
     * @param filePath 文件路径
     * @return true 成功
     * @return false 失败
     */
    bool convertFileToUTF8(const QString &filePath);

private:
    /**
     * @brief 追加日志
     * @param message 消息
     */
    void appendLog(const QString &message);

private:
    /**
     * @brief 递归填充树控件
     * @param folderPath 路径
     * @param parentItem 父节点
     */
    void populateTreeWidget(const QString &folderPath, QTreeWidgetItem *parentItem);

private:
    /**
     * @brief 遍历树控件并处理勾选的文件
     * @param item 条目
     */
    void processCheckedItems(QTreeWidgetItem *item);

private:
    /**
     * @brief 更新路径标签
     * @param path 路径
     */
    void updatePathLabel(const QString &path);

private:
    /**
     * @brief 判断是否需要过滤
     * @param fileName 文件名
     * @return true 是
     * @return false 否
     */
    bool shouldFilter(const QString& fileName);

};

#endif // MAINWINDOW_H
